package cn.feizhu.aimarket.ai.workflow.event;

import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

/**
 * 书籍保存事件监听器
 * 处理书籍保存后的后续业务逻辑，如通知、统计等
 * 
 * @author feizhu
 * @since 2025/10/21
 */
@Slf4j
@Component
public class BookSavedEventListener {

    /**
     * 处理书籍保存事件
     * 异步执行，不影响主流程性能
     * 
     * @param event 书籍保存事件
     */
    @Async
    @EventListener
    public void handleBookSavedEvent(BookSavedEvent event) {
        try {
            log.info("处理书籍保存事件 - bookId: {}, userId: {}, title: {}", 
                    event.getBookId(), event.getUserId(), event.getTitle());

            // TODO: 这里可以添加各种后续处理逻辑
            
            // 1. 更新用户统计信息
            updateUserStatistics(event.getUserId(), event.getAppId());
            
            // 2. 发送通知（如果需要）
            sendNotificationIfNeeded(event);
            
            // 3. 记录操作日志
            recordOperationLog(event);
            
            // 4. 触发其他业务逻辑（如推荐算法更新等）
            triggerRecommendationUpdate(event.getUserId());
            
            log.info("书籍保存事件处理完成 - bookId: {}", event.getBookId());
            
        } catch (Exception e) {
            log.error("处理书籍保存事件失败 - bookId: {}", event.getBookId(), e);
            // 这里可以考虑重试机制或者错误通知
        }
    }

    /**
     * 更新用户统计信息
     */
    private void updateUserStatistics(Long userId, Long appId) {
        log.debug("更新用户统计信息 - userId: {}, appId: {}", userId, appId);
        // TODO: 实现用户统计信息更新逻辑
        // 例如：增加用户创建的书籍数量、更新最后活跃时间等
    }

    /**
     * 发送通知（如果需要）
     */
    private void sendNotificationIfNeeded(BookSavedEvent event) {
        log.debug("检查是否需要发送通知 - userId: {}", event.getUserId());
        // TODO: 实现通知逻辑
        // 例如：邮件通知、站内消息、推送通知等
    }

    /**
     * 记录操作日志
     */
    private void recordOperationLog(BookSavedEvent event) {
        log.debug("记录操作日志 - bookId: {}, operation: BOOK_CREATED", event.getBookId());
        // TODO: 实现操作日志记录
        // 例如：记录到审计日志表、发送到日志收集系统等
    }

    /**
     * 触发推荐算法更新
     */
    private void triggerRecommendationUpdate(Long userId) {
        log.debug("触发推荐算法更新 - userId: {}", userId);
        // TODO: 实现推荐算法更新逻辑
        // 例如：更新用户画像、重新计算推荐内容等
    }
}